/** 绘图命名空间 */
export namespace NS {
  /**
   * 盒子大小
   * S0 - 宽度 - 盒子
   * S1 - 高度 - 盒子
   * S2 - 高度 - 临时高度(计算时临时变量)
   * S3 - 个数 - 组节点下第一个非空子节点下的S3个数(计算时临时变量，用于画线)
   * S4 - 个数 - 组节点下最后一个非空子节点下的S4个数(计算时临时变量，用于画线)
   */
  export type Size = [number, number, number, number, number];
  /** 节点类型: 0-串联;1-并联;2-普通节点 */
  export type NodeType = 0 | 1 | 2;
  /** 图形方向: 0-从左到右;1-从上到下 */
  export type GraphDirection = 0 | 1;
  /** 绘制图形配置 */
  export type Opts = {
    /** 图形上下左右偏移值 */
    offset: [number, number],
    /** 节点之间间隔(水平与垂直方向) */
    space: [number, number],
    /** 普通节点盒子大小 */
    size: [number, number],
    /** 箭头对角线长->对等边 */
    arrow: number;
    /** 是否紧凑模型 -> 是否绘制单串行节点 */
    compact: boolean;
    /** 是否调试 */
    debug: boolean;
    /** 图形方向：0-从左到右;1-从上到下 */
    direction: GraphDirection;
    /** 是否启用数据优化 - 清楚空组套空组或组组只有一个节点情况 */
    optimizeData: boolean;
  }

  /** 节点基础数据对象 */
  export interface XNode {
    /** 类型: 0-串联;1-并联;2-普通节点 */
    type: NodeType;
    /** 节点名称-唯一 */
    name: string;
    /** 子节点 */
    children?: XNode[];
    /** 节点强制依赖(画斜线), 多个使用逗号隔开 */
    lean?: string;
  }

  /** 节点绘制图形对象 */
  export interface DrwNode extends XNode {
    /** 节点类型 */
    type: NodeType;
    /** 节点名称 */
    name: string;
    /** 子节点集合 */
    children: DrwNode[];
    /** 上级节点名称 */
    pname?: string;
    /** 盒子大小 */
    size: Size;
    /** 盒子坐标 */
    position: [number, number];
  }

}

export class Constants {
  public static Serial: NS.NodeType = 0;
  public static Parallel: NS.NodeType = 1;
  public static Node: NS.NodeType = 2;

  public static GRAPH_DIRECTION_L2R = 0;
  public static GRAPH_DIRECTION_T2B = 1;
}

